<?php
/**
 * Created by PhpStorm.
 * User: jack.shan
 * Date: 2020/9/13
 * Time: 12:24
 */
namespace app\index\controller;

use app\index\BaseController;
use OSS\OssClient;
use think\facade\Config;
use think\facade\Db;
use think\facade\Filesystem;
use think\facade\View;

use Qiniu\Auth;
require dirname(__DIR__) . DIRECTORY_SEPARATOR . '../../vendor/qiniu/php-sdk/autoload.php';  //引入自动加载类
use Qiniu\Storage\UploadManager;

class File extends BaseController
{
    public function test()
    {

    }
    //本地
    public function local()
    {
        $picadr = '';
        if($this->request->isPost())
        {
            // 获取表单上传文件 例如上传了001.jpg
            $file = $this->request->file('image');

            if($file){

//                validate(['image'=>[
//                          'fileSize' => 410241024,
//                          'fileExt' => 'jpg,jpeg,png,bmp,gif',
//                          'fileMime' => 'image/jpeg,image/png,image/gif', //这个一定要加上，很重要我认为！
//                     ]])->check(['image' => $file]);


                $id = rand(1,100000);
                //$picadr = Filesystem::disk('data')->putFile( 'topic', $file);
                $picadr = Filesystem::disk('data')->putFile( 'topic', $file, function() use($id){
                    return date('Ymd') . '/' . intval($id / 1000) .  '/' . time();
                });
            }
        }
        View::assign([
            'picadr' => $picadr
        ]);
        return View::fetch("local");
    }

    //多文件上传
    public function localfs()
    {
        $picadrs = [];
        if($this->request->isPost())
        {
            // 获取表单上传文件 例如上传了001.jpg
            $files = $this->request->file('image');

            if($files){
                foreach ($files as $file)
                {
                    $picadrs[] = Filesystem::disk('data')->putFile( 'topic', $file);
                }
            }
        }

        View::assign([
            'picadrs' => $picadrs
        ]);
        return View::fetch("localfs");
    }

    //本地ajax
    public function local2()
    {

        if($this->request->isAjax())
        {
            // 获取表单上传文件 例如上传了001.jpg
            $file = $this->request->file('image');

            if($file){
                $id = rand(1,100000);
                //$picadr = Filesystem::disk('data')->putFile( 'topic', $file);
                $picadr = Filesystem::disk('data')->putFile( 'topic', $file, function() use($id){
                    return date('Ymd') .  '/' . intval($id / 1000) .  '/' . time();
                });

                return json(['status' => 0, 'url' => Config::get('app.data_url') .  '/' . $picadr]);
            }

            return json(['status' => 1, 'msg' => '上传失败！']);
        }

        return View::fetch("local2");
    }

    //七牛
    public function qiniu()
    {
        $picadr = '';
        if($this->request->isPost())
        {
            $file = $this->request->file('image');

            if($file){
                // 要上传图片的本地路径
                $filePath = $file->getRealPath();
                $ext = $file->getOriginalExtension();  //后缀
                // 上传到七牛后保存的文件名
                $key =substr(md5($file->getRealPath()) , 0, 5). date('YmdHis') . rand(0, 9999) . '.' . $ext;
                // 需要填写你的 Access Key 和 Secret Key
                // 构建鉴权对象
                $accessKey = Config::get('file.qiniu')["accessKey"];
                $secretKey = Config::get('file.qiniu')["secretKey"];
                $auth=new Auth($accessKey,$secretKey);
                // 要上传的空间
                $bucket = Config::get('file.qiniu')["bucket"];
                //域名
                $domain = Config::get('file.qiniu')["domain"];
                $token = $auth->uploadToken($bucket);
                // 初始化 UploadManager 对象并进行文件的上传
                $uploadMgr = new UploadManager();
                // 调用 UploadManager 的 putFile 方法进行文件的上传
                list($ret, $err) = $uploadMgr->putFile($token, $key, $filePath);
                if ($err !== null) {
                    return ["err"=>1,"msg"=>$err,"data"=>""];
                } else {
                    //返回图片的完整URL
                    $picadr = $domain.'/'.$key;

                }
            }
        }

        View::assign([
            'picadr' => $picadr
        ]);
        return View::fetch("qiniu");
    }

    //oss
    public function oss()
    {
        $picadr = '';
        if($this->request->isPost())
        {
            // 获取表单上传文件 例如上传了001.jpg
            $file = $this->request->file('image');

            if($file){
                $target = $file->getRealPath();
                $ext = $file->getOriginalExtension();  //后缀
                // 阿里云主账号AccessKey拥有所有API的访问权限，风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维，请登录RAM控制台创建RAM账号。
                $accessKeyId = Config::get('file.oss')["accessKeyId"];
                $accessKeySecret = Config::get('file.oss')["accessKeySecret"];
                // Endpoint以杭州为例，其它Region请按实际情况填写。
                $endpoint = Config::get('file.oss')["endpoint"];
                // 设置存储空间名称。
                $bucket= Config::get('file.oss')["bucket"];
                // 设置文件名称。
                //这里是由sha1加密生成文件名 之后连接上文件后缀，生成文件规则根据自己喜好，也可以用md5
                $object = Config::get('file.oss')["object"].sha1(date('YmdHis', time()) . uniqid()) . '.' .$ext;

                try{
                    $ossClient = new OssClient($accessKeyId, $accessKeySecret, $endpoint);

                    try {
                        $info = $ossClient->uploadFile($bucket, $object, $target);
                        $picadr = $info['info']['url'];
                    } catch (\OSS\Core\OssException $e) {
                        $result['mes'] = $e->getMessage();
                        $result['code'] = 4;
                        var_dump($result);
                    }

                } catch(\OSS\Core\OssException $e) {
                    $result['mes'] = $e->getMessage();
                    $result['code'] = 3;
                    var_dump($result);
                }

            }
        }
        View::assign([
            'picadr' => $picadr
        ]);
        return View::fetch("oss");
    }

}